home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / games / halo / gssdkcr.h < prev    next >
C/C++ Source or Header  |  2005-02-12  |  4KB  |  132 lines

  1. /*
  2.  
  3. GS SDK challenge-response algorithm 0.1
  4. by Luigi Auriemma
  5. e-mail: aluigi@altervista.org
  6. web:    http://aluigi.altervista.org
  7.  
  8.  
  9. INTRODUCTION
  10. ============
  11. This algorithm is referred to the challenge-response method used by some
  12. of the games that use the Gamespy SDK like Halo and Soldier of Anarchy.
  13. This handshake is used to let valid client to join the game servers, in
  14. fact if clients answer with a wrong response they are immediately kicked.
  15. If we get Halo as practical example we can see that we have the
  16. following 3 packets easily visible using a packet analyzer:
  17. - client -> server: client challenge (a text string of 32 chars)
  18. - server -> client: response to the client's challenge plus the
  19.                     server's challenge
  20. - client -> server: response calculated on the server's challenge
  21.  
  22.  
  23. HOW TO USE
  24. ==========
  25. The function gssdkcr() requires the following parameters:
  26. - the destination buffer that will contain the resulted string.
  27.   It must be 33 bytes long (32 plus the final NULL byte).
  28. - the "challenge" string (sent by the server or by the client).
  29. - the buffer containing the game's text string used for the calculation
  30.   of the response.
  31.   By default the Gamespy SDK uses 3b8dd8995f7c40a9a5c5b7dd5b481341 but
  32.   some games might use different values like Soldier of Anarchy that
  33.   uses 0AB3F935936211D19A2B080000300512 (the CLSID of the game).
  34.   However if the value is NULL, will be used the default value.
  35.  
  36. The return value is a pointer to the destination string.
  37.  
  38.  
  39. EXAMPLE
  40. =======
  41. In Halo for example we must use:
  42.   char  resp[33],
  43.         chall[] = ")nTu4y&t,Cr{P5j{6k<]^E@-ToF#Kg>m";
  44.   gssdkcr(resp, chall, 0);
  45.  
  46. while in Soldier of Anarchy we must change this one:
  47.   gssdkcr(resp, chall, "0AB3F935936211D19A2B080000300512");
  48.  
  49.  
  50. LICENSE
  51. =======
  52.     Copyright 2004 Luigi Auriemma
  53.  
  54.     This program is free software; you can redistribute it and/or modify
  55.     it under the terms of the GNU General Public License as published by
  56.     the Free Software Foundation; either version 2 of the License, or
  57.     (at your option) any later version.
  58.  
  59.     This program is distributed in the hope that it will be useful,
  60.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  61.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  62.     GNU General Public License for more details.
  63.  
  64.     You should have received a copy of the GNU General Public License
  65.     along with this program; if not, write to the Free Software
  66.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  67.  
  68.     http://www.gnu.org/licenses/gpl.txt
  69.  
  70. */
  71.  
  72.  
  73. #include <time.h>
  74.  
  75.  
  76. unsigned char *gssdkcr(
  77.   unsigned char *dst,
  78.   unsigned char *src,
  79.   unsigned char *key) {
  80.  
  81.     unsigned int    oz,
  82.                     i,
  83.                     keysz,
  84.                     count,
  85.                     old,
  86.                     tmp,
  87.                     randnum;
  88.     unsigned char   *ptr;
  89.     const static char
  90.                     key_default[] =
  91.                     "3b8dd8995f7c40a9a5c5b7dd5b481341";
  92.  
  93.     randnum = time(NULL);   // something random
  94.     if(!key) key = (unsigned char *)key_default;
  95.     keysz = strlen(key);
  96.  
  97.     ptr = src;
  98.     old = *ptr;
  99.     tmp = old < 0x4f;
  100.     count = 0;
  101.     for(oz = i = 1; i < 32; i++) {
  102.         count ^= ((((*ptr < old) ^ ((old ^ i) & 1)) ^ (*ptr & 1)) ^ tmp);
  103.         ptr++;
  104.         if(count) {
  105.             if(!(*ptr & 1)) { oz = 0; break; }
  106.         } else {
  107.             if(*ptr & 1) { oz = 0; break; }
  108.         }
  109.     }
  110.  
  111.     ptr = dst;
  112.     for(i = 0; i < 32; i++, ptr++) {
  113.         if(!oz || !i || (i == 13)) {
  114.             randnum = (randnum * 0x343FD) + 0x269EC3;
  115.             *ptr = (((randnum >> 16) & 0x7fff) % 93) + 33;
  116.             continue;
  117.         } else if((i == 1) || (i == 14)) {
  118.             old = src[i];
  119.         } else {
  120.             old = src[i - 1];
  121.         }
  122.         tmp = (old * i) * 17991;
  123.         old = src[(key[(src[i] + i) % keysz] + (src[i] * i)) & 31];
  124.         *ptr = ((old ^ key[tmp % keysz]) % 93) + 33;
  125.     }
  126.     *ptr = 0x00;
  127.  
  128.     return(dst);
  129. }
  130.  
  131.  
  132.